package middleware

import (
	"encoding/json"
	"github.com/gin-gonic/gin"
	"github.com/mssola/user_agent"
	"github.com/satori/go.uuid"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"shop-common/library/variables"
	"shop-common/utils/ip"
)

func Logger() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		// 每个请求生成的请求traceId具有全局唯一性
		traceId := uuid.NewV4().String()
		// 为日志添加请求的地址以及请求参数等信息
		var args []zapcore.Field
		args = append(args, zap.String("traceId", traceId))
		args = append(args, zap.String("method", ctx.Request.Method))
		args = append(args, zap.String("url", ctx.Request.URL.String()))
		// 将请求参数json序列化后添加进日志上下文
		if ctx.Request.Form == nil {
			ctx.Request.ParseMultipartForm(32 << 20)
		}
		form, _ := json.Marshal(ctx.Request.Form)
		args = append(args, zap.String("params", string(form)))

		//浏览器信息
		if !variables.AppDebug {
			ua := user_agent.New(ctx.Request.UserAgent())
			browserName, browserVersion := ua.Browser()
			args = append(args, zap.String("browser", browserName+" "+browserVersion))
			args = append(args, zap.String("os", ua.OS()))
			args = append(args, zap.String("ip", ip.RemoteIp(ctx.Request)))
		}

		variables.Logger.NewContext(ctx, args...)

		ctx.Next()
	}
}
